home *** CD-ROM | disk | FTP | other *** search
/ JCSM Shareware Collection 1993 November / JCSM Shareware Collection - 1993-11.iso / cl720 / prolc1j.lzh / PPL4C.USR < prev    next >
Text File  |  1992-08-23  |  50KB  |  1,322 lines

  1.  
  2.  
  3.                           Personal Protocol Library
  4.  
  5.                                 For the C Language
  6.  
  7.  
  8.                                     (PPL4C)
  9.  
  10.  
  11.  
  12.                                  USERS MANUAL
  13.  
  14.  
  15.  
  16.  
  17.  
  18.                                   Version 1.0
  19.  
  20.                                   Aug 16, 1992
  21.  
  22.  
  23.  
  24.  
  25.                         This software is provided as-is.
  26.                  There are no warranties, expressed or implied.
  27.  
  28.  
  29.  
  30.  
  31.                               Copyright (C) 1992
  32.                               All rights reserved
  33.  
  34.  
  35.  
  36.                               MarshallSoft Computing, Inc.
  37.                               Post Office Box 4543
  38.                               Huntsville AL 35815
  39.  
  40.                               Phone (205) 881-4630
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.         PPL4C Users Manual                                     Page 1
  61.                               C O N T E N T S
  62.  
  63.  
  64.  
  65.  
  66.  
  67.          Chapter                                                   Page
  68.  
  69.          1.0 Introduction..............................................3
  70.              1.1 Compiling the Library.................................3
  71.              1.2 User Support..........................................4
  72.              1.3 Installation..........................................5
  73.          2.0 State Drivers.............................................6
  74.          3.0 File Transfer Protocols...................................7
  75.              3.1 XMODEM................................................7
  76.              3.2 XMODEM-CRC............................................9
  77.              3.3 XMODEM-1K.............................................9
  78.              3.4 XMODEM-G.............................................10
  79.              3.5 YMODEM...............................................10
  80.              3.6 YMODEM-G.............................................10
  81.          4.0 Protocol Library Functions...............................11
  82.              4.1 xyAbort..............................................11
  83.              4.2 xyDriver.............................................11
  84.              4.3 xyGetErrorCode.......................................12
  85.              4.4 xyGetErrorState......................................12
  86.              4.5 xyGetFilename........................................12
  87.              4.6 xyGetNAKs............................................12
  88.              4.7 xyGetPacket..........................................12
  89.              4.8 xyGetState...........................................12
  90.              4.9 xyInit...............................................13
  91.              4.10 xyStartRx...........................................13
  92.              4.11 xyStartTx...........................................13
  93.          5.0 The FILEXFER.C Demonstration Program.....................14
  94.              5.1 Introduction.........................................14
  95.              5.2 The FILEXFER.H Parameter File........................15
  96.              5.3 Running FILEXFER.....................................16
  97.          6.0 Using The Protocol Library...............................17
  98.              6.1 Keyboard Input.......................................17
  99.              6.2 Disk I/O.............................................18
  100.              6.3 Serial I/O...........................................18
  101.              6.4 Other Events.........................................18
  102.          7.0 Problems.................................................19
  103.          8.0 Legal Issues.............................................20
  104.              8.1 Registration.........................................21
  105.              8.2 License..............................................21
  106.              8.3 Warranty.............................................21
  107.          9.0 Revision History.........................................21
  108.         10.0 Other MarshallSoft Computing Products....................22
  109.              10.1 The Personal Communications Library for C...........22
  110.              10.2 The Personal Communications Library for Pascal......22
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.         PPL4C Users Manual                                     Page 2
  121.          1.0 Introduction
  122.  
  123.          The Personal Protocol Library (PPL)  consist  of  a  state  driven
  124.          library   which  implements  the  XMODEM,  XMODEM-CRC,  XMODEM-1K,
  125.          XMODEM-G, YMODEM,  and  YMODEM-G  file  transfer  protocols.  This
  126.          allows   the   programmer   to  run  multiple  protocol  transfers
  127.          simultaneously while interacting with the user at the keyboard.
  128.  
  129.          The  PPL  requires  the  Personal  Protocol  Library  (PCL),  also
  130.          available   from  MarshallSoft  Computing.   The  user  should  be
  131.          familiar with PCL before  attempting  to  understand  the  protocol
  132.          driver. Refer to section "Other MarshallSoft Computing Products".
  133.  
  134.          What  are  the advantages of a state driven protocol library ? The
  135.          answer is  any  type  of  communications  program  which  requires
  136.          "background" protocol file transfers. A few examples are:
  137.  
  138.          (1)  EXAMPLE-1: A program that can read incoming stock market data
  139.          continuously  while  the  main  application  is  doing   technical
  140.          analysis.
  141.  
  142.          (2)  EXAMPLE-2:  A  custom  BBS  program  that can handle two file
  143.          transfers simultaneously.
  144.  
  145.          See the section 8.1 "Registration" for an offer who might not want
  146.          to refuse!
  147.  
  148.          1.1 Compiling the Library
  149.  
  150.          There are three small model library files provided:
  151.  
  152.          ppl4c_sb.lib  -- Borland Turbo C library.
  153.          ppl4c_sm.lib  -- Microsoft C library.
  154.          ppl4c_sx.mix  -- MIX Power C library.
  155.  
  156.          The  registered user can recompile the source code (source code is
  157.          provided in the registered version only) for the library using one
  158.          of the three provided batch files:
  159.  
  160.          make_sb.bat  -- make small Borland Turbo C library (ppl4c_sb.lib).
  161.          make_sm.bat  -- make small Micrsoft C library (ppl4c_sm.lib).
  162.          make_sx.bat  -- make small MIX Power C library (ppl4c_sx.mix).
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.         PPL4C Users Manual                                     Page 3
  181.          1.2 User Support
  182.  
  183.          We want you to be successful in developing your applications using
  184.          PPL4C!  We depend on our customers to let us know what  they  need
  185.          in  a  protocol library.  This means we are committed to providing
  186.          the best communications library that  we  can.  If  you  have  any
  187.          suggestions or comments, please write to us or give us a call.
  188.  
  189.          If  you  are  having  a  problem  using PPL4C, call (205) 881-4630
  190.          between 5 PM and 9 PM CST Monday through Saturday. You can call at
  191.          other times and leave a message, and call back  later  during  our
  192.          regular  business  hours  for a reply. You can also FAX us at this
  193.          same number at any time.
  194.  
  195.          You  may  also  call our 24 hour BBS (2400 baud, no parity, 8 data
  196.          bits, 1 stop bit) at any time.  The BBS will  contain  the  latest
  197.          shareware version of PPL4C, messages, and other related files. All
  198.          files  are  in standard ZIP format. You can leave a message on the
  199.          BBS, and we will usually have a reply  ready  for  you  within  24
  200.          hours.   The  dedicated telephone number is 205-880-9748. Set your
  201.          modem for 2400 baud, 8 data bits, no parity, one stop bit.
  202.  
  203.          The  MarshallSoft  Computing,  Inc.   newsletter  "Comm  Talk"  is
  204.          published quarterly.  It discusses various communications problems
  205.          and solutions using PCL4C (the communications library)  and  PPL4C
  206.          (the  protocol library) as well as related information. Registered
  207.          users receive a one year  complimentary  subscription  when  first
  208.          registering and for each update purchased.
  209.  
  210.          Of  course, you can always write to us. You should receive a reply
  211.          within one to two weeks.
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.         PPL4C Users Manual                                     Page 4
  241.          1.3 Installation
  242.  
  243.  
  244.          (1) Before installation of PPL4C, your C compiler  should  already
  245.          be  installed  on  your system and tested. If you are not familiar
  246.          with makefiles, refer to your compiler manual. If  you  are  using
  247.          the  interactive  environment  for  Quick C or Turbo C, be sure to
  248.          compile with the memory model corresponding to the  PPL4C  library
  249.          used.   Examine  the  file  "FILES.LST"  for  a  list  of  all the
  250.          distribution files.
  251.  
  252.          (2) Make a backup  copy  of  your  distribution  disk.   Put  your
  253.          original distribution disk in a safe place.
  254.  
  255.          (3)  Create  a  work  directory  on  your work disk (normally your
  256.          harddisk). For example, to create a work directory named PPL4C, we
  257.          first log onto the work disk and then type:
  258.  
  259.                                MKDIR PPL4C
  260.  
  261.          (4)  Copy  all the files from your backup copy of the distribution
  262.          disk to your work directory.  For example, to  copy  from  the  A:
  263.          drive to your work directory, we type:
  264.  
  265.                               CD PPL4C
  266.                               COPY A:*.*
  267.  
  268.          (5) [OPTIONAL] Delete the makefiles  that  you  won't  need.   For
  269.          example,  if  you  use  the Microsoft C compiler, then you want to
  270.          keep all makefiles ending *._M_ but can delete those for  Turbo  C
  271.          (*._T_), Quick C (*._Q_), and MIX Power C (X_*.BAT).  You may also
  272.          delete any libraries that you won't need.
  273.  
  274.          (6) Compile FILEXFER.C and link with the appropriate PPL4C library
  275.          (PPL4C_SM.LIB for Microsoft C, PPL4C_SB.LIB for Borland  Turbo  C,
  276.          and  PPL4C_SX.MIX  for  MIX Power C). MAKEFILES (or project files)
  277.          are provided for each of the supported compilers.
  278.  
  279.              a) Microsoft C: Type  MAKE FILEXFER._M_
  280.  
  281.              b) Microsoft Quick C: Type  MAKE FILEXFER._Q_
  282.  
  283.              c) Borland Turbo C: Type  MAKE -FFILEXFER._T_
  284.  
  285.              d) MIX Power C: Type X_FILEXFER
  286.  
  287.          FILEXFER.C  should  compile without any problems as all example code
  288.          has been tested with each of the supported compilers.
  289.  
  290.          (7) The recommended way to  test  FILEXFER  is  to  run  it  on  two
  291.          computers   connected   by  a  null  modem  cable.   See   section
  292.          "Problems" for a recommended approach to testing FILEXFER.
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299.  
  300.         PPL4C Users Manual                                     Page 5
  301.          2.0 State Drivers
  302.  
  303.          A state driver is a programming technique  in  which  a  typically
  304.          complex task in broken down into small steps known as states. Each
  305.          state  can be executed relatively quickly, and in particular never
  306.          does any waiting. The main application  program  calls  the  state
  307.          driver whenever it is waiting for a user keypress, or at any other
  308.          arbitrary time.  The effect is that the state driven code executes
  309.          whenever the main application code is not working.
  310.  
  311.          The  Microsoft  Windows  operating  system uses a variation on the
  312.          state driven technique. Think of each running program as a  state.
  313.          The operating system calls each state in turn (unlike the protocol
  314.          driver,  the states are independent). Each state (or program) must
  315.          yield the processor (by  getting  the  next  input  event)  or  by
  316.          explicitly  calling  a yield function. The operating system cannot
  317.          force any running program to yield the processor.
  318.  
  319.          Coding   a  file  transfer  protocol  as  a  state  driver  allows
  320.          simultaneous file transfers  to  occur.  Although  the  driver  is
  321.          written  for  a maximum of two ports since the their are at most 2
  322.          serial interrupts available on standard PCs, there  is  no  reason
  323.          that  the  driver  could  not  handle  more  than two simultaneous
  324.          transfers.
  325.  
  326.          The central difficulty is using a  state  driver  for  XMODEM  and
  327.          YMODEM  is  that those protocols time out if they have to wait too
  328.          long for a response.  The  solution  is  to  call  the  driver  at
  329.          approriate  times. In other words, the state driver must be called
  330.          often enough to prevent a protocol timeout.
  331.  
  332.          The XMODEM and YMODEM protocol timeout values in the state  driver
  333.          are longer than a strict implementation of the protocol standards.
  334.          This eases the timing requirements somewhat. However, if the other
  335.          side  of the transfer is running a strict implementation of XMODEM
  336.          or YMODEM then we can still have protocol timeout problems.
  337.  
  338.          The  following  section  "File  Transfer  Protocols"  provides   a
  339.          general  understanding  of  XMODEM  and YMODEM. In particular, pay
  340.          attention to the timeout requirements.
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357.  
  358.  
  359.  
  360.         PPL4C Users Manual                                     Page 6
  361.          3.0 File Transfer Protocols
  362.  
  363.  
  364.          3.1 XMODEM
  365.  
  366.          XMODEM  refers  to  the  file transfer protocol introduced by Ward
  367.          Christensen in 1977.  XMODEM  is  widely  supported  on  most  all
  368.          bulletin board systems.
  369.  
  370.          The following ASCII character definitions are used in XMODEM.
  371.  
  372.          <SOH>  =  01H  Is always the first byte in each block.
  373.          <EOT>  =  04H Sent instead of SOH to mark the end of transmission.
  374.          <ACK>  =  06H  Positive  acknowledgment.
  375.          <NAK>  = 15H Negative acknowledgment.
  376.          <CAN>  = 18H Cancel transfer.
  377.  
  378.          XMODEM is a receiver driven, asynchronous, 8  data  bit  protocol.
  379.          Each packet looks like the following:
  380.  
  381.          <SOH> <packet #> <compliment #> <data> <checksum>
  382.  
  383.          where <SOH> = 01H.
  384.  
  385.          <packet #> = Packet number, starting at 01, incrementing by 1, and
  386.          wraps from 0FFH to 00H (not to 01H).
  387.  
  388.          <compliment #> = 255 minus the packet number.
  389.  
  390.          <data> = 128 bytes of binary data.
  391.  
  392.          <checksum> = The sum of the data bytes. Starting with a  zero  add
  393.          each data byte to the checksum.  Use only the rightmost 8 bits.
  394.  
  395.          When  the  receiver is ready, it sends a NAK every 10 seconds ( up
  396.          to one minute ) until the NAK is ackowledged by the transmitter by
  397.          sending the first packet.  The transmitter  continues  by  sending
  398.          each  packet  in  turn,  always  waiting  for  the  packet  to  be
  399.          ackowleged before sending the next. Finally, when the  transmitter
  400.          has no more data, it sends an EOT instead of a SOH to complete the
  401.          transfer.
  402.  
  403.          Each packet is sent by the transmitter as follows:
  404.  
  405.          (1) Each packet always starts with a SOH.
  406.  
  407.          (2) The packet  number  is  sent  next,  starting  with  01H,  and
  408.          incrementing by 1. The packet number wraps from 0FFH to 00H.
  409.  
  410.          (3)  The  packet  number  compliment  is  sent next.  It is always
  411.          calculated a 255 minus the packet number.
  412.  
  413.          (4) Exactly 128 bytes of data is sent.  If the transmitter doesn't
  414.          have 128 bytes of data to send, then control-Z's (1AH) are  padded
  415.          to the data block.
  416.  
  417.  
  418.  
  419.  
  420.         PPL4C Users Manual                                     Page 7
  421.          (5)  The  checksum  is  calculated  by added together all 128 data
  422.          bytes and sending the least significant 8 bits.
  423.  
  424.          (6) The transmitter waits ( up to 10 seconds ) for a response.  If
  425.          the  response  is an ACK, then the transmitter goes on to the next
  426.          packet.  If the response is a NAK, then the  transmitter  re-sends
  427.          the  entire  packet.  If  the  response is a CAN, then all further
  428.          transmission is cancelled.
  429.  
  430.          Each packet is handled by the receiver as follows:
  431.  
  432.          (1) If the first character is an EOT  then  the  transfer  is  now
  433.          complete,  and  the receiver should ACK the EOT before exiting. If
  434.          the  first  character  is  a  CAN,  then  all  further  action  is
  435.          cancelled. If the first character is a SOH, then this is the first
  436.          character of the next packet.
  437.  
  438.          (2) If the packet number is not correct ( the first packet is 1 ),
  439.          then  this is a fatal error, and the receiver should send a CAN to
  440.          the transmitter in order to cancel further transmission.
  441.  
  442.          (3) If the packet number compliment is not correct, this is also a
  443.          fatal error and the receiver sends a CAN to the transmitter.
  444.  
  445.          (4) Exactly 128 bytes of data are received.
  446.  
  447.          (5) The checksum is received.   It  is  compared  with  the  value
  448.          obtained by computing the checksum from the just received data. If
  449.          the  checksum  values  are  the  same,  an  ACK  to  sent  to  the
  450.          transmitter. Otherwise, a NAK is sent.
  451.  
  452.          Here is a XMODEM example of the data flow.  It  includes  the  two
  453.          most  common  line  hits:  a  garbaged  block,  and an <ACK> reply
  454.          getting garbaged.  <data>  represent  128  bytes  of  data.   <CS>
  455.          represents the checksum byte.
  456.  
  457.          SENDER                                      RECEIVER
  458.          ======                                      ========
  459.  
  460.                                      <---               <NAK>
  461.          <SOH> 01 FE <data> <CS>      --->
  462.                                      <---               <ACK>
  463.          <SOH> 02 FD <data> <CS>      --->       (data gets line hit)
  464.                                      <---               <NAK>
  465.          <SOH> 02 FD <data> <CS>      --->
  466.                                      <---               <ACK>
  467.          <SOH> 03 FC <data> <CS>      --->
  468.          (ACK gets garbaged)         <---               <ACK>
  469.          <SOH> 03 FC <data> <CS>      --->              <ACK>
  470.          <EOT>                        --->
  471.                                       <---       <anything except ACK>
  472.          <EOT>                         --->
  473.                                       <---              <ACK>
  474.  
  475.  
  476.  
  477.  
  478.  
  479.  
  480.         PPL4C Users Manual                                     Page 8
  481.          3.2 XMODEM-CRC
  482.  
  483.          The  XMODEM-CRC protocol is similar to the XMODEM protocol, except
  484.          that the receiver specifies CRC-16 by sending C (Hex  43)  instead
  485.          of NAK when requesting the FIRST block.  A two byte CRC is sent in
  486.          place of the one byte arithmetic checksum.
  487.  
  488.          3.3 XMODEM-1K
  489.  
  490.          The  XMODEM-1K  protocol  is  identical to XMODEM-CRC, except that
  491.          1024 byte data blocks in addition to 128 byte data blocks  can  be
  492.          sent.  An STX (02H) replaces the SOH (01H) at the beginning of the
  493.          transmitted  block  to  notify  the  receiver  of the longer block
  494.          length.  The transmitted block contains 1024 bytes of  data.   The
  495.          receiver should be able to accept any mixture of 128 and 1024 byte
  496.          blocks.   The  block  number (in the second and third bytes of the
  497.          block) is incremented by one for  each  block  regardless  of  the
  498.          block length.
  499.  
  500.          The sender must not change between 128 and 1024 byte block lengths
  501.          if it has not received a valid ACK for the current block.
  502.  
  503.          Here is an example of XMODEM-1K with 1024 blocks:
  504.  
  505.               SENDER                                  RECEIVER
  506.               ======                                  ========
  507.                                                       C
  508.               STX 01 FE Data[1024] CRC CRC
  509.                                                       ACK
  510.               STX 02 FD Data[1024] CRC CRC
  511.                                                       ACK
  512.               STX 03 FC Data[1000] ^Z[24] CRC CRC
  513.                                                       ACK
  514.               EOT
  515.                                                       ACK
  516.  
  517.          Mixed 1024 and 128 byte Blocks
  518.  
  519.               SENDER                                  RECEIVER
  520.               ======                                  ========
  521.                                                       C
  522.               STX 01 FE Data[1024] CRC CRC
  523.                                                       ACK
  524.               STX 02 FD Data[1024] CRC CRC
  525.                                                       ACK
  526.               SOH 03 FC Data[128] CRC CRC
  527.                                                       ACK
  528.               SOH 04 FB Data[100] ^Z[28] CRC CRC
  529.                                                       ACK
  530.               EOT
  531.                                                       ACK
  532.  
  533.  
  534.  
  535.  
  536.  
  537.  
  538.  
  539.  
  540.         PPL4C Users Manual                                     Page 9
  541.          3.4 XMODEM-G
  542.  
  543.          The  XMODEM-G protocol works like XMODEM-1K except that the sender
  544.          never waits for a packet ACK. This results in  a  faster  transfer
  545.          than would otherwise occur.  However, hardware flow control (RTS -
  546.          CTS)  must be turned on. Be carefull if you are using a null modem
  547.          cable for PC to PC transfer since many null modem  cables  do  not
  548.          exchange   RTS  and  CTS  as  required.   Refer  to  the  Personal
  549.          Communication Library  Users  Manual  for  a  discussion  of  flow
  550.          control.
  551.  
  552.          3.5 YMODEM
  553.  
  554.          The YMODEM  Batch  protocol  is  an  extension  to  the  XMODEM-1K
  555.          protocol that allows 0 or more files to be transmitted in a single
  556.          session. YMODEM always sends an information packet (number 0) with
  557.          each file containing the filename and the file length.
  558.  
  559.          The  filename  is sent as a null terminated ASCII string.  This is
  560.          the filename format used by the handle MSDOS oriented functions.
  561.  
  562.          The length field is sent as a decimal ASCII  string  counting  the
  563.          number  of  data  bytes  in  the  file.   The file length does not
  564.          include any ^Z or other characters used to pad the last block. All
  565.          unused bytes in packet 0 must be set to 0.
  566.  
  567.          After the file has been transmitted, the  receiver  asks  for  the
  568.          next  file  by  sending  a  'C'.   Transmission of a null pathname
  569.          terminates the YMODEM protocol. An EOT is not transmitted after  a
  570.          null pathname. Here is an example of YMODEM:
  571.  
  572.             SENDER                                  RECEIVER
  573.             ======                                  ========
  574.                                                     C
  575.                                                     C
  576.             SOH 00 FF Filename NULs CRC CRC
  577.                                                     ACK
  578.                                                     C
  579.             STX 01 FE Data[1024] CRC CRC
  580.                                                     ACK
  581.             STX 02 FD Data[1024] CRC CRC
  582.                                                     ACK
  583.             SOH 03 FC Data[128] CRC CRC
  584.                                                     ACK
  585.             SOH 04 FB Data[100] ^Z[28] CRC CRC
  586.                                                     ACK
  587.             EOT
  588.                                                     ACK
  589.                                                     C
  590.             SOH 00 FF NUL[128] CRC CRC
  591.                                                     ACK
  592.  
  593.          3.6 YMODEM-G
  594.  
  595.          YMODEM-G  is  similiar  to XMODEM-G in that the sender never waits
  596.          for a packet ACK. Refer to the section "XMODEM-G".
  597.  
  598.  
  599.  
  600.         PPL4C Users Manual                                     Page 10
  601.          4.0 Protocol Library Functions
  602.  
  603.          There  are  11 protocol library functions. Their prototypes are in
  604.          file xyDriver.h and are as follows:
  605.  
  606.          int  xyAbort(int);
  607.          int  xyDriver(int);
  608.          int  xyGetErrorCode(int);
  609.          int  xyGetErrorState(int);
  610.          char *xyGetFilename(int);
  611.          int  xyGetNAKs(int);
  612.          int  xyGetPacket(int);
  613.          int  xyGetState(int);
  614.          int  xyInit(int,int);
  615.          int  xyStartTx(int,char *,int,int);
  616.          int  xyStartRX(int,char *,char,int);
  617.  
  618.          All  state  driver  functions  return  a  negative  value  for   a
  619.          communications  error.  See  the PCL4C manuals for a list of these
  620.          errors.
  621.  
  622.          The function  xyInit  should  be  called  after  initializing  the
  623.          selected  port  with SioReset. Then, either xyStartTx or xyStartRx
  624.          should be called to initiate file transfer. The file  transfer  is
  625.          done when xyDriver return a 0 (NO_ERROR).
  626.  
  627.          Examine  the library test program FILXFER.C for an example of the
  628.          proper use of the state driver functions.
  629.  
  630.          4.1 xyAbort
  631.  
  632.          int xyAbort(C)
  633.          int C;          /* channel (0 or 1) */
  634.  
  635.          The xyAbort functions aborts any file transfer occuring on channel
  636.          C and return the channel to the idle state.  The  protocol  driver
  637.          will send a cancel command to the other end.
  638.  
  639.          4.2 xyDriver
  640.  
  641.          int xyDriver(C)
  642.          int C;          /* channel (0 or 1) */
  643.  
  644.          The  xyDriver  function  should  be  called  as often as possible.
  645.          Typically there are two places that it is called.   The  first  is
  646.          whenever  the  main  application  is waiting for a keypress.  This
  647.          should be implemented by forcing all keyboard input to go  through
  648.          a  user  written  keyboard  input  routine.   Refer to the section
  649.          "Using  the Protocol Library" for an example. xyDriver should also
  650.          be called periodically during any long operation such as disk I/O.
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.  
  660.         PPL4C Users Manual                                     Page 11
  661.          4.3 xyGetErrorCode
  662.  
  663.          int xyGetErrorCode(C)
  664.          int C;          /* channel (0 or 1) */
  665.  
  666.          The  xyGetErrorCode  function  is  called  once xyDriver returns a
  667.          positive value indicating that it is  complete.  The  user  should
  668.          then  call  xyGetErrorCode  to  determine if there was an error in
  669.          the transfer and if so, what the error was.
  670.  
  671.          4.4 xyGetErrorState
  672.  
  673.          int xyGetErrorState(C)
  674.          int C;          /* channel (0 or 1) */
  675.  
  676.          The xyGetErrorState function is called to determine the state that
  677.          the  protocol  driver  was  in  when the error occured. Don't call
  678.          xyGetErrorState unless an  error  has  occured  as  determined  by
  679.          calling xyGetErrorCode.
  680.  
  681.          4.5 xyGetFilename
  682.  
  683.          char *xyGetFilename(C)
  684.          int C;          /* channel (0 or 1) */
  685.  
  686.          The  xyGetFilename  function returns the name of the file that the
  687.          protocol driver is transfering. This is particularly  useful  when
  688.          multiple files are being transfered by YMODEM.
  689.  
  690.          4.6 xyGetNAKs
  691.  
  692.          int xyGetNAKs(C)
  693.          int C;          /* channel (0 or 1) */
  694.  
  695.          The xyGetNAKs function is used to return the  accumulative  number
  696.          of NAKed packets.
  697.  
  698.          4.7 xyGetPacket
  699.  
  700.          int xyGetPacket(C)
  701.          int C;          /* channel (0 or 1) */
  702.  
  703.          The xyGetPacket function returns the current packet number while a
  704.          protocol transfer is underway. Otherwise it return a -1.
  705.  
  706.          4.8 xyGetState
  707.  
  708.          int xyState(C)
  709.          int C;          /* channel (0 or 1) */
  710.  
  711.          The  xyState  function returns the current state of  the  protocol
  712.          driver.  Refer  to  xyDriver.h for a list of all driver states and
  713.          their values.
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.         PPL4C Users Manual                                     Page 12
  721.          4.9 xyInit
  722.  
  723.          int xyInit(C,Port)
  724.          int C;          /* channel (0 or 1) */
  725.          int Port;       /* Port (COM1 to COM4) */
  726.  
  727.          The xyInit  function  should  be  called  after  initializing  the
  728.          selected serial port. The first port should be assigned to channel
  729.          0  and  the  second,  if defined, should be assigned to channel 1.
  730.          The channel number is used to identify the port in all  subsequent
  731.          calls to state driver functions.
  732.  
  733.          Recall  that  ports  COM1 and COM3 can not be used simultaneously,
  734.          and that ports COM2 and COM4 cannot be used simultaneously.
  735.  
  736.          4.10 xyStartRx
  737.  
  738.          int xyStartRx(C,Filename,NCGchar,BatchFlag)
  739.          int C;          /* channel (0 or 1) */
  740.          char *Filename; /* filename */
  741.          char NCGchar;   /* startup character */
  742.          int BatchFlag;  /* TRUE for YMODEM */
  743.  
  744.          The  xyStartRx  function is called to start XMODEM / YMODEM as the
  745.          receiver. The correct flag values are as follows:
  746.  
  747.          Protocol    NCGchar   BatchFlag
  748.          XMODEM       NAK        FALSE
  749.          XMODEM-CRC   'C'        FALSE
  750.          XMODEM-1K    'C'        FALSE
  751.          XMODEM-G     'G'        FALSE
  752.          YMODEM       'C'        TRUE
  753.          YMODEM-G     'G'        TRUE
  754.  
  755.          4.11 xyStartTx
  756.  
  757.          int xyStartTx(C,Filename,OneKflag,BatchFlag)
  758.          int C;          /* channel (0 or 1) */
  759.          char *Filename; /* filename */
  760.          int OneKflag;   /* TRUE for XMODEM-1K and YMODEM */
  761.          int BatchFlag;  /* TRUE for YMODEM */
  762.  
  763.          The  xyStartTx  function is called to start XMODEM / YMODEM as the
  764.          sender. The correct flag values are as follows:
  765.  
  766.          Protocol    OneKflag   BatchFlag
  767.          XMODEM       FALSE       FALSE
  768.          XMODEM-CRC   FALSE       FALSE
  769.          XMODEM-1K    TRUE        FALSE
  770.          XMODEM-G     FALSE       FALSE
  771.          YMODEM       TRUE        TRUE
  772.          YMODEM-G     TRUE        TRUE
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.         PPL4C Users Manual                                     Page 13
  781.          5.0 The FILEXFER Demonstration Program
  782.  
  783.          5.1 Introduction
  784.  
  785.          The  FILEXFER  demonstration  program  is  capable  of  doing  two
  786.          simultaneous  protocol  file  transfers while interacting with the
  787.          user at the keyboard. This is accomplished by coding the  protocol
  788.          transfer  code as a state driver (refer to the previous section on
  789.          State Drivers).
  790.  
  791.          The  best  way  to  run  FILEXFER  is to connect two PCs running a
  792.          communications program (such as the  TERM  program  on  the  PCL4C
  793.          distribution  diskette)  to a third PC running FILEXFER, connected
  794.          by null modem cables.
  795.  
  796.          If  you  only  have   two   PCs,   you  can still run the FILEXFER
  797.          program with just one channel.
  798.  
  799.          The   FILEXFER   demonstration   program   requires  the  Personal
  800.          Communications Library (PCL4C) to run. If you don't already have a
  801.          copy, you can find it on most of the larger  information  services
  802.          and  bulletin  boards such as CompuServe, GENIE, and Exec-PC.  You
  803.          also can usually find it in the larger shareware disk  distributor
  804.          libraries.   Lastly,  you  can always download it from our 24 hour
  805.          BBS (205-880-9748 at 2400 baud, 8 data bits,  no  parity,  1  stop
  806.          bit).
  807.  
  808.          Before attempting to run FILEXFER, try transfering files using the
  809.          TERM  program  on  the PCL distribution disk. Start by transfering
  810.          files via XMODEM between two machines connected by  a  null  modem
  811.          cable  at  9600  baud.  Once  you have TERM working on both sides,
  812.          replace TERM by FILEXFER on one side.
  813.  
  814.          FILEXFER has been found to run at speeds up to  38400  baud  using
  815.          one   channel   and   up   to   19200   baud  using  two  channels
  816.          simultaneously on a 386 machine. You ought to be able to run  9600
  817.          on most all machines.
  818.  
  819.  
  820.  
  821.  
  822.  
  823.  
  824.  
  825.  
  826.  
  827.  
  828.  
  829.  
  830.  
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837.  
  838.  
  839.  
  840.         PPL4C Users Manual                                     Page 14
  841.          5.2 The FILEXFER.H Parameter File
  842.  
  843.          The FILEXFER.H include  file  contains  all  the  user  changeable
  844.          parameters for the FILEXFER.C demonstration program.
  845.  
  846.          Be sure to read the comments in the FILEXFER.H file.
  847.  
  848.          5.2.1 The AT_COMMAND_SET parameter
  849.  
  850.          The  AT_COMMAND_SET  parameter  is used to specify that a Hayes AT
  851.          command set compatible modem will be connected to each port  being
  852.          used (one or two as specified by NBR_OF_CHANNELS).
  853.  
  854.          5.2.2 The RTS_CTS_CONTROL Parameter
  855.  
  856.          The  RTS_CTS_CONTROL parameter is used to specify if hardware flow
  857.          control  is  being  used  on  all   channels   as   specified   by
  858.          NBR_OF_CHANNELS.   If you define this parameter to be TRUE and you
  859.          are using a Null modem cable to connect two PC's together, be sure
  860.          that RTS and CTS are swapped just like TX and RX are  swapped.  In
  861.          many Null Modem cables, this is not the case.
  862.  
  863.          5.2.3 The NBR_OF_CHANNELS Parameter
  864.  
  865.          The  NBR_OF_CHANNELS  parameter specifies the number of concurrent
  866.          ports that you will run. The only two legal values are  1  and  2.
  867.          The  first  port  specifies is known as channel 0 while the second
  868.          port (if NBR_OF_CHANNELS is defined to be 2) is known  as  channel
  869.          1.
  870.  
  871.          5.2.4 The PRI_PORT Parameter
  872.  
  873.          The  PRI_PORT  parameter  specifies the primary port, which can be
  874.          COM1, COM2, COM3, or COM4. The primary  port  is  associated  with
  875.          channel 0.
  876.  
  877.          5.2.5 The SEC_PORT Parameter
  878.  
  879.          The   SEC_PORT  parameter  specifies  the  secondary  port.   This
  880.          parameter is used provided that NBR_OF_CHANNELS is defined  to  be
  881.          2. Legal values of the secondary port are ( depending on the value
  882.          of the primary port):
  883.  
  884.          PRI_PORT     SEC_PORT
  885.            COM1       COM2 or COM4
  886.            COM2       COM1 or COM3
  887.            COM3       COM2 or COM4
  888.            COM4       COM1 or COM3
  889.  
  890.          The secondary port is associated with channel 1.
  891.  
  892.  
  893.  
  894.  
  895.  
  896.  
  897.  
  898.  
  899.  
  900.         PPL4C Users Manual                                     Page 15
  901.          5.2.6 The PRI_BAUD Parameter
  902.  
  903.          The PRI_BAUD parameter specifies the baud rate associated with the
  904.          primary  port (channel 0). Limit the baud rate to 19200 if you are
  905.          running two ports simultaneously.
  906.  
  907.          5.2.7 The SEC_BAUD Parameter
  908.  
  909.          The SEC_BAUD parameter specifies the baud rate associated with the
  910.          secondary port (channel 1). Limit the baud rate to  19200  if  you
  911.          are running two ports simultaneously.
  912.  
  913.          5.3 Running FILEXFER
  914.  
  915.          To run the FILEXFER program, follow these steps:
  916.  
  917.          (1) Edit the FILEXFER.H parameters file. Be conservative the first
  918.          time you run FILEXFER. Use one channel and a baud  rate  of  9600.
  919.          After  you  have run FILEXFER successfully with one port, then you
  920.          can try two ports.
  921.  
  922.          (2) Compile FILEXFER and link with  the  PPL  and  PCL  libraries.
  923.          Use the provided makefile:
  924.  
  925.            FILEXFER._T_ for the Borland Turbo C compiler.
  926.            FILEXFER._M_ for the Microsoft Optimizing compiler.
  927.            FILEXFER._Q_ for the Microsoft Quick C compiler.
  928.            X_FILEXF.BAT for the MIX Power C compiler.
  929.  
  930.          (3)  Run  FILEFER  on  one  PC  connected  to one or two other PCs
  931.          running a communications program such as TERM.
  932.  
  933.          (4) Start XMODEM receive in FILEXFER, then start  XMODEM  send  on
  934.          the  connected  PCs.  As  the  file  protocol  progresses, you can
  935.          monitor it's state by selected the "C)omm Status" choice from  the
  936.          FILEXFER menu.
  937.  
  938.          The one line FILEXFER menu is:
  939.  
  940.                Q)uit P)rotocol S)end R)eceive A)bort C)omm Status
  941.  
  942.          The menu line allows the user to:
  943.  
  944.          (1) Quit FILEXFER.
  945.          (2) Set the protocol (XMODEM,XMODEM-CRC,XMODEM-1K,YMODEM,YMODEM-G)
  946.          (3) Send a file (wildcards accepted). Channel must be idle.
  947.          (4) Receive a file.
  948.          (5) Abort a file transfer. Returns channel to idle state.
  949.          (6) Get driver status. Reports current state and packet.
  950.  
  951.  
  952.  
  953.  
  954.  
  955.  
  956.  
  957.  
  958.  
  959.  
  960.         PPL4C Users Manual                                     Page 16
  961.          6.0 Using The Protocol Library
  962.  
  963.          Before  attempting to use the protocol library, be sure to run the
  964.          demonstration program FILEXFER. Only when you are  satisfied  that
  965.          FILEXFER  runs  correctly  should  you attempt to use the protocol
  966.          library in your own application.
  967.  
  968.          There are only a few hard rules to follow  in  order  to  use  the
  969.          protocol  library  successfully.  The first is that you absolutely
  970.          must call xyDriver often.  There is no way that the  state  driver
  971.          library  can  operate without timing out if you don't.
  972.  
  973.          6.1 Keyboard Input
  974.  
  975.          You must always call xyDriver when waiting for  a  keypress.  This
  976.          means  that all keyboard input should be called through  a central
  977.          keyboard input routine.  For  example,  if  you  are  running  two
  978.          channels:
  979.  
  980.               int ReadKey()
  981.               {while(!SioKeyPress())
  982.                   {xyDriver(0);
  983.                    xyDriver(1);
  984.                   }
  985.                return( SioKeyPress() );
  986.               } /* end ReadKey */
  987.  
  988.               #define CR 0x0d
  989.  
  990.               int ReadString(String)
  991.               char String[];
  992.               {char x;
  993.                int i;
  994.                for(i=0;;i++)
  995.                  {x = ReadKey();
  996.                   if(x==CR)
  997.                      {String[i] = '\0';
  998.                       return(i);
  999.                      }
  1000.                   else String[i++] = x;
  1001.                  } /* end for */
  1002.                } /* end ReadString */
  1003.  
  1004.               int ReadInteger()
  1005.               {char Buffer[40];
  1006.                int Length;
  1007.                Length = ReadString(Buffer);
  1008.                return(atoi(Buffer));
  1009.               } /* end ReadInteger */
  1010.  
  1011.               float ReadFloat()
  1012.               {char Buffer[40];
  1013.                int Length;
  1014.                Length = ReadString(Buffer);
  1015.                return(atof(Buffer));
  1016.               } /* end ReadInteger */
  1017.  
  1018.  
  1019.  
  1020.         PPL4C Users Manual                                     Page 17
  1021.          6.2 Disk I/O
  1022.  
  1023.          In general, reading from a harddisk is not a problem if  you  call
  1024.          xyDriver  after  after  1000 bytes or so. Don't  attempt  to  read
  1025.          or write too large a block of data.
  1026.  
  1027.          Don't do disk I/O to a floppy while the protocol driver is running
  1028.          (not  in  the  idle  state). However, it is OK to let the protocol
  1029.          driver read and write to a floppy disk  provided  that  the  other
  1030.          channel is not also doing floppy disk I/O.
  1031.  
  1032.          6.3 Serial I/O
  1033.  
  1034.          You  can  do  serial  I/O  while  the  protocol  driver is running
  1035.          provided that you are using a port (and interrupt) different  from
  1036.          the  one  that the protocol driver is using. However, you must not
  1037.          wait for any input. This means that you should not attempt to read
  1038.          more  characters  from  the  input  buffer  than  is  returned  by
  1039.          SioRxQue.  And,  remember to call the protocol driver often. Don't
  1040.          read or write more than 1000 bytes without calling xyDriver.
  1041.  
  1042.          6.4 Other Events
  1043.  
  1044.          In general, you can process any event provided that you don't take
  1045.          too  long  ! Remember that when the protocol driver is transfering
  1046.          files, it  is  expecting  certain  handshaking  operations  to  be
  1047.          performed  in  a  certain  maximum amout of time.  If that time is
  1048.          exceeded, then a protocol timeout error  occurs.  Even  though  we
  1049.          have  relaxed the timeing restrictions within the protocol driver,
  1050.          the other end  of  the  serial  line  (another  XMODEM  or  YMODEM
  1051.          program)  expects not to have to wait too long before cancelling a
  1052.          transfer session.
  1053.  
  1054.          Just remember to call xyDriver  often.  If  you  are  experiencing
  1055.          timeout errors, insert more calls to xyDriver.
  1056.  
  1057.  
  1058.  
  1059.  
  1060.  
  1061.  
  1062.  
  1063.  
  1064.  
  1065.  
  1066.  
  1067.  
  1068.  
  1069.  
  1070.  
  1071.  
  1072.  
  1073.  
  1074.  
  1075.  
  1076.  
  1077.  
  1078.  
  1079.  
  1080.         PPL4C Users Manual                                     Page 18
  1081.          7.0 Problems
  1082.  
  1083.          If you can't get FILEXFER to run, try the following procedure:
  1084.  
  1085.          (1) Connect two PCs together using a null  modem  cable.  Run  the
  1086.          TERM   program  (from  the  PCL  distribution  diskette)  on  both
  1087.          machines at 2400 baud. If you can't get TERM to run, refer to your
  1088.          PCL (Personal Communications Library) manuals for help.
  1089.  
  1090.          (2) Once TERM is running correcly, try  transferring  files  using
  1091.          XMODEM. Start the receiver side first.
  1092.  
  1093.          (3)  Replace TERM on one machine with FILEXFER. Be sure to set the
  1094.          baud rate and port  in  the  FILEXFER.H  file  and  re-compile  as
  1095.          necessary.
  1096.  
  1097.          (4)  Try a XMODEM transfer first. If this works, then try a YMODEM
  1098.          transfer.
  1099.  
  1100.          Once  the  above  is working, you might try adding a third machine
  1101.          and have FILEXFER do two file transfers simulaneously.
  1102.  
  1103.          If you can get FILEXFER to work correctly at 2400 baud but not  at
  1104.          a higher baud rate, you might consider using 16550 UARTs. They can
  1105.          be programmed (using SioFIFO) to buffer up to 14 characters before
  1106.          generating an interrupt.
  1107.  
  1108.          We can help you get FILEXFER running, but we cannot help you debug
  1109.          your application. The central difficulty is in calling xyDriver in
  1110.          time  to prevent a protocol timeout.  This can be a tough problem.
  1111.          Study FILEXFER to see how it can be done.
  1112.  
  1113.  
  1114.  
  1115.  
  1116.  
  1117.  
  1118.  
  1119.  
  1120.  
  1121.  
  1122.  
  1123.  
  1124.  
  1125.  
  1126.  
  1127.  
  1128.  
  1129.  
  1130.  
  1131.  
  1132.  
  1133.  
  1134.  
  1135.  
  1136.  
  1137.  
  1138.  
  1139.  
  1140.         PPL4C Users Manual                                     Page 19
  1141.          8.0 Legal Issues
  1142.  
  1143.          8.1 Registration
  1144.  
  1145.  
  1146.          The  shareware  version  of  PPL4C.LIB is provided so that you may
  1147.          personally determine the usefulness of the product  for  yourself.
  1148.          If  you  can  use  the  Personal  Protocol  Library  for C, please
  1149.          register your use with us. Send $35 plus $3  S&H  ($6  outside  of
  1150.          North America) to:
  1151.  
  1152.                   MarshallSoft Computing, Inc.
  1153.                   Post Office Box  4543
  1154.                   Huntsville AL 35815
  1155.  
  1156.          The  user  may also order both the Personal Communications Library
  1157.          (PCL4C) and the Personal Protocol Library (PPL4C) at the same time
  1158.          for $65.  Registered users of PCL4C can order the protocol library
  1159.          PPL4P for $25 and also receive the latest version of PCL4C for  no
  1160.          extra charge.
  1161.  
  1162.          Please  pay  by  check in US dollars drawn on a US bank.  Purchase
  1163.          Orders (POs) are accepted from recognized US schools and companies
  1164.          listed in Dunn & Bradstreet.   Print  the  file  PPL4C.INV  if  an
  1165.          invoice is needed. The registered package is mailed first class US
  1166.          Mail  (packet  air  mail  overseas). If you are in a hurry, please
  1167.          call us and we can ship immediately within the USA by COD  (street
  1168.          address and phone number required).
  1169.  
  1170.          The registered package includes:
  1171.  
  1172.          o  No shareware screen.
  1173.          o  C source code for the library.
  1174.          o  Printed Users Manual.
  1175.          o  Telephone / FAX / BBS  support for one year.
  1176.          o  One year subscription (quarterly) to MSC newsletter.
  1177.          o  All updates (with printed manuals) are $15  plus  $3  S&H
  1178.             ($6  outside  of  North  America).  Updates for PCL4C and PPL4C
  1179.             together are $25.
  1180.  
  1181.          PPL4C.C  is  the  source  code for the library. The source code is
  1182.          copyrighted by MarshallSoft Computing, Inc. The user is granted  a
  1183.          license  to use the PPL4C object code in his own application only.
  1184.          PPL4C.C is not shareware and may not be  sold  or  given  away  to
  1185.          anyone.
  1186.  
  1187.          The registered user will receive the latest version  of  PPL4C  by
  1188.          return  mail.  A 5.25" diskette is provided unless a 3.5" diskette
  1189.          is requested.
  1190.  
  1191.  
  1192.  
  1193.  
  1194.  
  1195.  
  1196.  
  1197.  
  1198.  
  1199.  
  1200.         PPL4C Users Manual                                     Page 20
  1201.          8.2 License
  1202.  
  1203.  
  1204.          MarshallSoft Computing, Inc. grants the registered user  of  PPL4C
  1205.          the  right  to  use  the  PPL4C  library  (in  object form) in the
  1206.          development  of  any  software  product  without  any   royalties.
  1207.          However,  the  source  code for the library may not be released in
  1208.          whole or in part.
  1209.  
  1210.  
  1211.          8.3 Warranty
  1212.  
  1213.  
  1214.          MARSHALLSOFT COMPUTING, INC. DISCLAIMS ALL WARRANTIES RELATING  TO
  1215.          THIS  SOFTWARE,  WHETHER  EXPRESSED  OR IMPLIED, INCLUDING BUT NOT
  1216.          LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY  AND  FITNESS
  1217.          FOR  A  PARTICULAR  PURPOSE, AND ALL SUCH WARRANTIES ARE EXPRESSLY
  1218.          AND SPECIFICALLY DISCLAIMED. NEITHER MARSHALLSOFT COMPUTING,  INC.
  1219.          NOR ANYONE ELSE WHO HAS BEEN INVOLVED IN THE CREATION, PRODUCTION,
  1220.          OR  DELIVERY  OF  THIS  SOFTWARE SHALL BE LIABLE FOR ANY INDIRECT,
  1221.  
  1222.          CONSEQUENTIAL, OR INCIDENTAL DAMAGES ARISING OUT  OF  THE  USE  OR
  1223.          INABILITY  TO  USE  SUCH  SOFTWARE EVEN IF MARSHALLSOFT COMPUTING,
  1224.          INC.  HAS BEEN ADVISED OF  THE  POSSIBILITY  OF  SUCH  DAMAGES  OR
  1225.          CLAIMS. IN NO EVENT SHALL MARSHALLSOFT COMPUTING, INC.'S LIABILITY
  1226.          FOR ANY SUCH DAMAGES EVER EXCEED THE PRICE PAID FOR THE LICENSE TO
  1227.          USE  THE SOFTWARE, REGARDLESS OF THE FORM OF THE CLAIM. THE PERSON
  1228.          USING  THE  SOFTWARE  BEARS  ALL  RISK  AS  TO  THE  QUALITY   AND
  1229.          PERFORMANCE OF THE SOFTWARE.
  1230.  
  1231.          Some  states  do not allow the exclusion of the limit of liability
  1232.          for consequential or incidental damages, so the  above  limitation
  1233.          may not apply to you.
  1234.  
  1235.          This  agreement  shall  be  governed  by  the laws of the State of
  1236.          Alabama and shall inure to the benefit of Marshallsoft  Computing,
  1237.          Inc.   and  any successors, administrators, heirs and assigns. Any
  1238.          action or proceeding brought by either  party  against  the  other
  1239.          arising  out of or related to this agreement shall be brought only
  1240.          in a STATE or FEDERAL COURT of competent jurisdiction  located  in
  1241.          Madison County, Alabama. The parties hereby consent to in personam
  1242.          jurisdiction of said courts.
  1243.  
  1244.  
  1245.          9.0 Revision History
  1246.  
  1247.  
  1248.          Version 1.0 -- 10 August 1992 -- original release.
  1249.  
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.  
  1258.  
  1259.  
  1260.         PPL4C Users Manual                                     Page 21
  1261.          10.0 Other MarshallSoft Computing Products
  1262.  
  1263.          10.1 The Personal Communications Library for C
  1264.  
  1265.          The Personal Communications Library for the C Language (PCL4C)  is
  1266.          an  asynchronous  communications  library designed for experienced
  1267.          software  developers  programming  in  C.   Four   compilers   are
  1268.          supported:  Microsoft  Optimizing  C,  Microsoft  Quick C, Borland
  1269.          Turbo C, and MIX Power  C.   An  IBM  PC/XT/AT  or  compatible  is
  1270.          required.  The PCL features:
  1271.  
  1272.          o SMALL, COMPACT, MEDIUM & LARGE memory models.
  1273.          o 32 communications and support functions.
  1274.          o Support for the high performance INS16550 UART.
  1275.          o Supports hardware (RTS/CTS) flow control.
  1276.          o Interrupt driven receiver.
  1277.          o Supports 300 baud to 115,200 baud.
  1278.          o Supports COM1, COM2, COM3, and  COM4.
  1279.          o Adjustable receive queues from 8 bytes to 32 KB.
  1280.          o Control-BREAK error exit.
  1281.          o 17 communications error conditions trapped.
  1282.          o Allows 2 ports to run concurrently.
  1283.          o Complete modem control & status.
  1284.          o Written in assembly language for small size & high speed.
  1285.          o Terminal program featuring XMODEM, YMODEM, & YMODEM-G.
  1286.  
  1287.          The Personal Communications Library for C (PCL4C) is available for
  1288.          $45  plus  $3 S&H ($6 S&H overseas). It may be ordered at the same
  1289.          time as the Personal Protocol Library for $65 plus $3.50  S&H  ($7
  1290.          overseas).
  1291.  
  1292.          10.2 The Personal Communications Library for Pascal
  1293.  
  1294.          The  Personal Communications Library for Pascal (PCL4P) is a Turbo
  1295.          Pascal version of the Personal Communications Library for  C,  and
  1296.          is  available  for  $45 plus $3 S&H ($6 S&H overseas). It contains
  1297.          the same library functions, example programs,  documentation,  and
  1298.          user support as the C version.
  1299.  
  1300.  
  1301.  
  1302.  
  1303.  
  1304.  
  1305.  
  1306.  
  1307.  
  1308.  
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.  
  1320.         PPL4C Users Manual                                     Page 22
  1321.  
  1322.